package org.opens.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {

    /**
     * 功能: 将字符串时间转换为Date, 时间格式必须是yyyy-MM-dd
     */
    public static Date parse(String dateStr) {
        return parse(dateStr, "yyyy-MM-dd");
    }

    /**
     * 功能: 将字符串时间转换为Date, 时间格式可以手动指定
     */
    public static Date parse(String dateStr, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return Date.from(LocalDateTime.of(LocalDate.parse(dateStr, formatter), LocalTime.of(0, 0, 0))
                .atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 功能: 将Date转换为一天的开始时间
     */
    public static Date beginOfDay(Date date) {
        ZoneId systemDefault = ZoneId.systemDefault();
        LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), systemDefault);
        return Date.from(LocalDateTime.of(dateTime.toLocalDate(), LocalTime.of(0, 0, 0)).atZone(systemDefault).toInstant());
    }

    /**
     * 功能: 将Date转换为一天的结束时间
     */
    public static Date endOfDay(Date date) {
        ZoneId systemDefault = ZoneId.systemDefault();
        LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), systemDefault);
        return Date.from(LocalDateTime.of(dateTime.toLocalDate(), LocalTime.of(23, 59, 59)).atZone(systemDefault).toInstant());
    }

    /**
     * 功能: 将Date格式化为String, 转换后的格式为yyyy-MM-dd
     */
    public static String format(Date date) {
        return format(date, "yyyy-MM-dd");
    }

    /**
     * 功能: 将Date格式化为String, 转换后的格式为可以手动指定
     */
    public static String format(Date date, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        ZoneId systemDefault = ZoneId.systemDefault();
        LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), systemDefault);
        return dateTime.format(formatter);
    }

    /**
     * 功能: 控制当前时间偏移;
     * @param date          待偏移时间
     * @param offsetUnit    偏移单位
     * @param offsetNum     偏移量
     */
    public static Date offset(Date date, int offsetUnit, int offsetNum) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(offsetUnit, offsetNum);
        return cal.getTime();
    }

}
